package com.gzl.b2b.demo.dao;

import com.gzl.b2b.demo.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository;

import java.util.List;
import java.util.stream.Stream;

/**
 *  基于elastic Query DSL 写的
 * TODO：不是所有的dsl语句都可以放到 @Query 中使用
 * @Query 中只能用于查询，分页和排序 可能需要使用 Pageable 对象
 *
 * @version 1.0, 2019/4/15
 */
public interface UserAnnotationRepository
		extends ElasticsearchCrudRepository<User, Long> {

	/**
	 * 根据名字查询用户并排序
	 * 
	 * @return
	 */
	@Query("{\"bool\" : {\"must\" : {\"match\" : {\"name\" : \"?0\"}}}}")
	Page<User> findByQueryOrderByAge(String name, Pageable pageable);

	@Query("select * from User u")
	Stream<User> findByUserAll();


	/**
	 *  TODO 测试：排序无效, sort 不能放到query注解中使用
	 * @param name
	 * @return
	 */
//	@Query("{\"bool\":{\"must\":{\"term\":{\"name\":\"?0\"}}},\"sort\":{\"age\":{\"order\":\"desc\"}}}")
	@Query("{\"bool\" : {\"must\" : [{\"match\" : {\"name\" : ?0}}]}} ,\"sort\" : [{\"age\" : {\"order\": \"asc\"}]}")
	List<User> findByQueryOrderByAge(String name);

	@Query("{ \"match_all\" : {}}")
	List<User> getAllUsers();


	/**
	 * TODO： 报错
	 * @return
	 */
	@Query("{\"from\":0,\"size\":200,\"query\":{\"bool\":{\"filter\":[{\"bool\":{\"must\":[{\"wildcard\":{\"name\":{\"wildcard\":\"mo*\",\"boost\":1.0}}}],\"adjust_pure_negative\":true,\"boost\":1.0}}],\"adjust_pure_negative\":true,\"boost\":1.0}}}")
	List<User> getAllUsersOrderByAge();

	@Query("{\"bool\" : {\"must\" : {\"match\" : {\"name\" : \"?0\"}}}}")
	List<User> findByQuery(String name);
}
